Skip to content

Springback UV map#

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 120

from cut_predictor import ProjectionPredictor
doe = pd.read_csv('../data/doe.csv')
doe.describe()
doe_id Material_ID Blechdicke Niederhalterkraft Ziehspalt Stempel_ID Einlegeposition Ziehtiefe Breite UG OG E Rp0 Rp0.2 Rp100 Rp25 Rp50
count 1000.000000 1000.000000 1000.000000 1000.00000 1000.00000 1000.000000 1000.000000 1000.000000 1000.00000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000
mean 500.500000 3.866000 1.188370 251.12000 2.17280 2.716000 -0.422000 45.000000 70.65440 1.548120 1.809720 129.102675 209.942033 217.051735 481.885749 401.776216 442.422026
std 288.819436 1.637292 0.224187 147.00325 0.36093 0.451162 3.326708 16.591422 0.72186 0.257163 0.302279 58.332400 56.832894 54.073664 112.525169 61.073415 80.305188
min 1.000000 1.000000 0.990000 10.00000 1.60000 2.000000 -5.000000 30.000000 70.20000 1.140000 1.330000 71.681980 133.182632 147.101263 384.123147 369.820589 383.041834
25% 250.750000 3.000000 1.000000 120.00000 1.60000 2.000000 -3.250000 30.000000 70.20000 1.140000 1.330000 71.681980 138.226960 147.601859 384.123147 369.820589 383.041834
50% 500.500000 4.000000 1.010000 250.00000 2.40000 3.000000 -0.500000 40.000000 70.20000 1.710000 2.000000 118.282190 235.160326 237.951493 451.324586 374.608673 415.842304
75% 750.250000 5.000000 1.480000 380.00000 2.40000 3.000000 2.000000 55.000000 71.80000 1.710000 2.000000 191.372450 248.796491 251.315902 534.002871 385.773439 449.528189
max 1000.000000 6.000000 1.480000 500.00000 2.40000 3.000000 5.000000 70.000000 71.80000 1.710000 2.000000 200.038130 296.556500 306.211480 711.700600 556.006850 629.530400
data = pd.read_csv('../data/springback_uvmap.csv')
data.drop(data[data.doe_id == 1000].index, inplace=True)
data.drop(data[data.doe_id == 247].index, inplace=True)
data
doe_id u v x y z thickness epseqpl thinning
0 1 1.000000e+00 1.421085e-14 -132.603620 -117.544130 0.895656 1.000417 0.000823 0.990512
1 1 5.002402e-01 2.986321e-02 -0.000088 -87.060616 0.489975 0.991176 0.010210 0.981363
2 1 7.361977e-05 5.247185e-02 137.002380 -104.238950 0.742256 1.000619 0.001208 0.990712
3 1 5.551115e-16 3.080869e-15 132.603620 -117.544130 0.895656 1.000417 0.000823 0.990512
4 1 5.002410e-01 8.821827e-07 -0.000141 -95.070107 0.536487 0.992336 0.007779 0.982511
... ... ... ... ... ... ... ... ... ...
14886944 998 7.497377e-01 3.346449e-01 -89.967537 28.110500 35.537619 1.354696 0.277900 0.915335
14886945 998 7.489015e-01 3.419461e-01 -89.548157 28.170677 37.664772 1.345915 0.279300 0.909402
14886946 998 7.489397e-01 3.498405e-01 -89.451439 28.237469 39.968052 1.340451 0.279300 0.905710
14886947 998 7.498949e-01 3.560328e-01 -89.724800 28.299198 41.775429 1.393057 0.217900 0.941255
14886948 998 7.499789e-01 3.633505e-01 -89.672142 28.375393 43.917314 1.420526 0.182900 0.959815

14863026 rows × 9 columns

reg = ProjectionPredictor()
reg.load_data(
    doe = doe,
    data = data,
    index='doe_id',
    process_parameters = [
        'Blechdicke', 
        'Niederhalterkraft', 
        'Ziehspalt', 
        'Einlegeposition', 
        'Ziehtiefe',
        'Stempel_ID',
    ],
    categorical = [
        'Ziehspalt', 
        'Ziehtiefe',
        'Stempel_ID',
    ],
    position = ['u', 'v'],
    output = ['x', 'y', 'z'] ,#, 'thickness', 'epseqpl', 'thinning']
    validation_split=0.1,
    validation_method='random' #'leaveoneout'
)
reg.data_summary()
Data summary
------------------------------------------------------------

Process parameters:
    - Blechdicke : numerical [ 0.99  ...  1.48 ]
    - Niederhalterkraft : numerical [ 10  ...  500 ]
    - Ziehspalt : categorical [1.6, 2.4]
    - Einlegeposition : numerical [ -5  ...  5 ]
    - Ziehtiefe : categorical [30, 50, 70]
    - Stempel_ID : categorical [2, 3]
Input variables:
    - u : numerical, [ 0.0 / 1.0 ] 
    - v : numerical, [ 0.0 / 1.012877269773833 ] 
Output variable(s):
    - x : numerical, [ -202.42731 / 202.42731 ]
    - y : numerical, [ -118.32256 / 96.918961 ]
    - z : numerical, [ 0.0 / 73.213165 ]

Inputs (14863026, 12)
Outputs (14863026, 3)
Total number of experiments: 637
Total number of samples: 14863026
Number of training samples: 13376723
Number of test samples: 1486303

config = {
    'batch_size': 2048*16,
    'max_epochs': 50,
    'layers': [256, 256, 256, 256, 256],
    'dropout': 0.0,
    'learning_rate': 0.001,
    'activation': 'lrelu'
}

reg.custom_model(save_path='../models/best_uv_xyz_model', config=config, verbose=True)
reg.training_summary()
Metal device set to: Apple M1 Pro

systemMemory: 16.00 GB
maxCacheSize: 5.33 GB

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 256)               3328      

 leaky_re_lu (LeakyReLU)     (None, 256)               0         

 dense_1 (Dense)             (None, 256)               65792     

 leaky_re_lu_1 (LeakyReLU)   (None, 256)               0         

 dense_2 (Dense)             (None, 256)               65792     

 leaky_re_lu_2 (LeakyReLU)   (None, 256)               0         

 dense_3 (Dense)             (None, 256)               65792     

 leaky_re_lu_3 (LeakyReLU)   (None, 256)               0         

 dense_4 (Dense)             (None, 256)               65792     

 leaky_re_lu_4 (LeakyReLU)   (None, 256)               0         

 dense_5 (Dense)             (None, 3)                 771       

=================================================================
Total params: 267,267
Trainable params: 267,267
Non-trainable params: 0
_________________________________________________________________
Epoch 1/50
409/409 [==============================] - 17s 39ms/step - loss: 0.0139 - val_loss: 0.0064
Epoch 2/50
409/409 [==============================] - 16s 39ms/step - loss: 0.0045 - val_loss: 0.0030
Epoch 3/50
409/409 [==============================] - 16s 38ms/step - loss: 0.0023 - val_loss: 0.0017
Epoch 4/50
409/409 [==============================] - 16s 39ms/step - loss: 0.0013 - val_loss: 9.0440e-04
Epoch 5/50
409/409 [==============================] - 16s 38ms/step - loss: 7.4672e-04 - val_loss: 7.0664e-04
Epoch 6/50
409/409 [==============================] - 16s 38ms/step - loss: 5.3759e-04 - val_loss: 0.0014
Epoch 7/50
409/409 [==============================] - 16s 38ms/step - loss: 3.0408e-04 - val_loss: 1.8592e-04
Epoch 8/50
409/409 [==============================] - 16s 39ms/step - loss: 5.6797e-04 - val_loss: 1.5441e-04
Epoch 9/50
409/409 [==============================] - 16s 39ms/step - loss: 1.6323e-04 - val_loss: 1.2028e-04
Epoch 10/50
409/409 [==============================] - 16s 39ms/step - loss: 0.0023 - val_loss: 0.0018
Epoch 11/50
409/409 [==============================] - 16s 38ms/step - loss: 7.0798e-04 - val_loss: 3.8913e-04
Epoch 12/50
409/409 [==============================] - 16s 38ms/step - loss: 2.7306e-04 - val_loss: 2.3731e-04
Epoch 13/50
409/409 [==============================] - 16s 38ms/step - loss: 1.6684e-04 - val_loss: 2.1905e-04
Epoch 14/50
409/409 [==============================] - 16s 38ms/step - loss: 4.2315e-04 - val_loss: 1.1010e-04
Epoch 15/50
409/409 [==============================] - 16s 38ms/step - loss: 9.9432e-05 - val_loss: 8.1064e-05
Epoch 16/50
409/409 [==============================] - 16s 38ms/step - loss: 9.6346e-05 - val_loss: 6.6006e-05
Epoch 17/50
409/409 [==============================] - 16s 39ms/step - loss: 7.1121e-04 - val_loss: 2.4080e-04
Epoch 18/50
409/409 [==============================] - 16s 38ms/step - loss: 1.4322e-04 - val_loss: 8.6549e-05
Epoch 19/50
409/409 [==============================] - 16s 38ms/step - loss: 2.2064e-04 - val_loss: 7.4070e-05
Epoch 20/50
409/409 [==============================] - 16s 39ms/step - loss: 8.0201e-05 - val_loss: 5.4994e-05
Epoch 21/50
409/409 [==============================] - 16s 38ms/step - loss: 7.4919e-05 - val_loss: 5.3461e-05
Epoch 22/50
409/409 [==============================] - 16s 38ms/step - loss: 5.9307e-04 - val_loss: 2.8007e-04
Epoch 23/50
409/409 [==============================] - 16s 38ms/step - loss: 1.1385e-04 - val_loss: 6.3960e-05
Epoch 24/50
409/409 [==============================] - 16s 38ms/step - loss: 6.7276e-05 - val_loss: 5.0187e-05
Epoch 25/50
409/409 [==============================] - 16s 38ms/step - loss: 6.9262e-05 - val_loss: 4.8103e-05
Epoch 26/50
409/409 [==============================] - 16s 38ms/step - loss: 1.9159e-04 - val_loss: 4.5047e-05
Epoch 27/50
409/409 [==============================] - 16s 39ms/step - loss: 5.6364e-05 - val_loss: 3.4592e-05
Epoch 28/50
409/409 [==============================] - 16s 38ms/step - loss: 5.1091e-05 - val_loss: 4.3549e-05
Epoch 29/50
409/409 [==============================] - 16s 39ms/step - loss: 4.9751e-05 - val_loss: 3.0712e-05
Epoch 30/50
409/409 [==============================] - 16s 39ms/step - loss: 5.1773e-05 - val_loss: 5.2196e-05
Epoch 31/50
409/409 [==============================] - 16s 38ms/step - loss: 2.8516e-04 - val_loss: 3.8043e-05
Epoch 32/50
409/409 [==============================] - 16s 38ms/step - loss: 4.7286e-05 - val_loss: 3.2020e-05
Epoch 33/50
409/409 [==============================] - 16s 38ms/step - loss: 4.4699e-05 - val_loss: 3.6287e-05
Epoch 34/50
409/409 [==============================] - 16s 38ms/step - loss: 4.3070e-05 - val_loss: 3.3830e-05
Epoch 35/50
409/409 [==============================] - 16s 38ms/step - loss: 4.1736e-05 - val_loss: 4.6607e-05
Epoch 36/50
409/409 [==============================] - 16s 39ms/step - loss: 4.2521e-05 - val_loss: 2.2384e-05
Epoch 37/50
409/409 [==============================] - 16s 38ms/step - loss: 3.8857e-05 - val_loss: 2.2915e-05
Epoch 38/50
409/409 [==============================] - 15s 38ms/step - loss: 3.8909e-05 - val_loss: 5.9432e-05
Epoch 39/50
409/409 [==============================] - 15s 38ms/step - loss: 0.0011 - val_loss: 9.5437e-05
Epoch 40/50
409/409 [==============================] - 15s 38ms/step - loss: 7.3374e-05 - val_loss: 5.5382e-05
Epoch 41/50
409/409 [==============================] - 16s 38ms/step - loss: 1.1251e-04 - val_loss: 3.8459e-04
Epoch 42/50
409/409 [==============================] - 16s 38ms/step - loss: 7.5961e-05 - val_loss: 3.9398e-05
Epoch 43/50
409/409 [==============================] - 16s 38ms/step - loss: 4.6591e-05 - val_loss: 3.6834e-05
Epoch 44/50
409/409 [==============================] - 16s 38ms/step - loss: 4.3632e-05 - val_loss: 3.5948e-05
Epoch 45/50
409/409 [==============================] - 16s 38ms/step - loss: 4.3689e-05 - val_loss: 3.6867e-05
Epoch 46/50
409/409 [==============================] - 16s 38ms/step - loss: 4.1827e-05 - val_loss: 3.5228e-05
Epoch 47/50
409/409 [==============================] - 16s 38ms/step - loss: 1.8641e-04 - val_loss: 2.9534e-05
Epoch 48/50
409/409 [==============================] - 16s 38ms/step - loss: 3.6224e-05 - val_loss: 3.1125e-05
Epoch 49/50
409/409 [==============================] - 16s 39ms/step - loss: 3.4418e-05 - val_loss: 3.8199e-05
Epoch 50/50
409/409 [==============================] - 16s 38ms/step - loss: 3.4602e-05 - val_loss: 2.0422e-05
46/46 [==============================] - 1s 14ms/step - loss: 2.0422e-05
INFO:tensorflow:Assets written to: models/best_uv_model/assets
Validation mse: 2.0422303350642323e-05

reg.load_network('../models/best_uv_xyz_model')
Metal device set to: Apple M1 Pro

systemMemory: 16.00 GB
maxCacheSize: 5.33 GB


idx = np.random.choice(data['doe_id'].unique()) 
print("Doe_ID", idx)
reg.compare(idx)
Doe_ID 310

import plotly
import plotly.graph_objs as go
plotly.offline.init_notebook_mode()

def plotly_show_surface(x, y):
    # Configure the trace.
    trace = go.Scatter3d(
        x=y[0, :, :].flatten(),  
        y=y[1, :, :].flatten(),
        z=y[2, :, :].flatten(),
        mode='markers',
        marker={
            'size': 0.2,
            'opacity': 0.8,
        }
    )

    # Configure the layout.
    layout = go.Layout(
        margin={'l': 0, 'r': 0, 'b': 0, 't': 0}
    )

    data = [trace]

    plot_figure = go.Figure(data=data, layout=layout)

    # Render the plot.
    plotly.offline.iplot(plot_figure)


%matplotlib inline
plt.rcParams['figure.dpi'] = 150

def mpl_show_surface(x, y):

    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    p = ax.scatter(
        y[0, :, :].flatten(),  
        y[1, :, :].flatten(),
        y[2, :, :].flatten(),
        s=0.001
    )
x, y = reg.predict({
        'Blechdicke': 1.01, 
        'Niederhalterkraft': 410.0, 
        'Ziehspalt': 2.4, 
        'Einlegeposition': -5, 
        'Ziehtiefe': 30,
        'Stempel_ID': 3,
        'E': 191.37245,
        'Rp0': 138.22696,
        'Rp50': 449.528189,
    }, 
    shape=(500, 500))

plotly_show_surface(x, y)
reg.interactive(mpl_show_surface, positions=(500, 500))
interactive(children=(FloatSlider(value=1.1883700000000001, description='Blechdicke', max=1.48, min=0.99, step…